算法创作实战02 - 用 MaxMSP 生成随机颜色
介绍了随机和噪声在算法创作中的应用。上一篇我们用 Max/MSP 做了一个随机生成星座描述的小应用,切身实践和感受了巴纳姆效应。
今天我们一起来用 Max/MSP 实现简单的随机颜色生成器,加深对 Max/MSP 中 random
对象的了解。
名称:Random Color
主要使用的对象:random, send, receive, uzi, pack, jit.matrix, jit.pwindow
难度系数:★☆☆☆☆
这个程序叫 Random Color,可以指定行(y)和列(x)的数量,然后用随机颜色填充,可以手动生成新的图像,也可以自动连续生成。生成的图像可以导出成图片。最后的成果是这样:
手动生成或者自动连续生成
指定图像的尺寸(dim)
生成随机颜色
自动填充每一个单元格
显示图像
导出图片
开始动手前,请复习 Max/MSP 文档中 random, send, receive, uzi, pack, jit.matrix, jit.pwindow 等对象的说明。
准备就绪后,我们先来看前两步如何实现:
1.手动生成或者自动连续生成
用 button
触发生成事件,前面加上 metro
对象并指定时间间隔就可以自动连续触发生成事件。
2.指定图像的尺寸(dim)
设置两个整数数字框,可以输入水平和垂直维度的数量,来指定图像的尺寸。生成事件的 bang、x 和 y 的数值,都通过 send
(简写为 s) 对象传递到后面的步骤。
接下来是关键的部分,用随机颜色自动填充每一个单元格:
3.生成随机颜色
用 3 个random
对象分别生成 R G B 三个颜色值,然后用 pack
对象打包起来。因为最后需要用 jit.pwindow
显示图像,它需要接收 ARGB 颜色,所以我们还需要用 setcell
消息指定需要填充的单元格,并且传递 255 作为 ARGB 的 Alpha 值。于是,pack 对象的参数需要写成:pack setcell 0 0 val 255 0 0 0
。其中,前面两个 0 会传入之前通过数字框输入的 x 和 y 的垂直和水平 dim 值,后面 3 个 0 会传入由 random
对象生成的 GRB 值。
4.自动填充每一个单元格
编程中经常使用 for 循环来实现矩阵的填充,在 MaxMSP 里常用 uzi
对象来实现简单的循环效果。(当然,如果是 modern 的矩阵处理和运算,会用 jit 提供的丰富的矩阵功能;这里我们怀旧一下用 uzi)uzi
的作用是连续发出 bang,左入口接收触发命令,右入口接收连续 bang 的数量;左出口输出 bang,中出口输出完成所有 bang 后的消息,右出口输出当前是第几个 bang。
首先接收 y 维度的值,用 1 个 uzi
作为外层循环。因为 uzi
对象从 1 开始计数,所以需要减去 1 再传给 setcell
,因为矩阵单元格从 0 开始计数。然后接收 x 维度的值,作为内层循环(同样要减去 1)。
uzi
和 random
生成的矩阵单元格位置和颜色都传给 pack
对象打包。
最后是显示和导出图像:
5.显示图像
使用 jit.matrix
存储并显示矩阵,更多 jit.matrix
的用法请参考 00 翻译的 Max/MSP/Jitter 官方教程系列。
指定矩阵为 4 个平面(plane),用 receive
对象(简写为 r)接受 x 和 y 维度的值。为了实时响应维度修改的操作,这里用 pak
对象而不是 pack
对象。pak
对象响应任一一个输入的变化,而 pack
对象需要由 bang 触发何时响应。
另外,使用一直开启的 qmetro
对象(@active 属性为 1)来监控矩阵的变化,以便随时更新,将矩阵值通过 send
对象发送给 jit.pwindow
中显示。
6.导出图片
用 exportimage
消息可以触发 jit.matrix
导出图像保存。因为矩阵的初始尺寸是 10x10,所以最后用了一个 jit.matrix 4 char 400 400
将矩阵扩大为 400x400 的尺寸,这样导出的图像大小就是 400x400 像素。
完整的 patch 如下:
Max/MSP/Jitter 教程系列
Max/MSP/Jitter 教程 01 - 什么是矩阵?
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 04 - 创建矩阵
Max/MSP/Jitter 教程 05 - 矩阵的数学运算
友情提示:独自折腾 Max 易患上癔症……不妨入群互助
👇👇👇